/*
  Name: 栈的链式实现 
  Copyright: 
  Author: 
  Date: 
  Description: 
*/

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

#include "ds.h" //for Status,OK ...

#ifndef ElemType
#define ElemType int /* 数据元素类型默认为 int */
#define ELEMTYPE_TAG
#endif


///////////////////////////////////////////////////////////
//链栈的存储结构定义 
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

typedef LinkList LinkStack; //链栈类型 

///////////////////////////////////////////////////////////
//链栈的基本操作声明

//构造一个空栈S 
Status InitStack(LinkStack &S);
//销毁栈S 
Status DestroyStack(LinkStack &S);
//将栈S清空 
Status ClearStack(LinkStack &S);
//若栈S为空返回TRUE，否则FALSE 
Status StackEmpty(LinkStack S);
//返回栈S中的元素个数
int    StackLength(LinkStack S);
//用e返回栈顶元素
//    前提：栈S存在且不空 
Status GetTop(LinkStack S, ElemType &e);
//元素e入栈S 
Status Push(LinkStack &S, ElemType e);
//S出栈用e返回出栈元素 
//    前提：栈S存在且不空 
Status Pop(LinkStack &S, ElemType &e);

///////////////////////////////////////////////////////////
//链栈的基本操作的实现

//构造一个空栈S 
Status InitStack(LinkStack &S)
{
    // TODO (#1#): 构造一个空栈S，不带头结点 
    return ERROR;
    //-------------------------------------
}

//销毁栈S 
Status DestroyStack(LinkStack &S)
{
    // TODO (#1#):销毁栈S，相当于清空栈 
    return ERROR;
    //-------------------------------------
}

//将栈S清空 
Status ClearStack(LinkStack &S)
{
    // TODO (#1#): 将栈S清空，释放所有结点
    return ERROR;
    //-------------------------------------
}

//若栈S为空返回TRUE，否则FALSE 
Status StackEmpty(LinkStack S)
{
    // TODO (#1#): 若栈S为空返回TRUE，否则FALSE
    return TRUE;
    //-------------------------------------
}

//返回栈S中的元素个数
int    StackLength(LinkStack S)
{
    // TODO (#1#): 返回栈S中的元素个数
    return 0;
    //-------------------------------------
}

//用e返回栈顶元素
//    前提：栈S存在且不空 
Status GetTop(LinkStack S, ElemType &e)
{
    // TODO (#1#):若栈S不空，则用e返回栈顶元素
    return ERROR;
    //-------------------------------------
}

//元素e入栈S 
Status Push(LinkStack &S, ElemType e)
{
    // TODO (#1#): 插入元素e作为新的栈顶 
    return ERROR;
    //-------------------------------------
}

//S出栈用e返回出栈元素 
//    前提：栈S存在且不空 
Status Pop(LinkStack &S, ElemType &e)
{
    // TODO (#1#):若栈S不空，则删除栈顶元素用e返回 
    return ERROR;
    //-------------------------------------
}


#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif

#endif

